home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Magazin: Amiga-CD 1997 November & December
/
Amiga-CD 1997 #11-12.iso
/
pd-disketten
/
dms-gepackt
/
5_96
/
apd-5-96-2.dms
/
apd-5-96-2.adf
/
Amiga-E-Kurs
/
Listing_2.e
< prev
next >
Wrap
Text File
|
1996-04-15
|
3KB
|
113 lines
/* Vergleich von Sortieralgos, ©1995 M. Bennicke */
MODULE '*listing_1', -> Pfad & Name evtl. anpassen
'intuition/intuition','intuition/screens',
'graphics/modeid','dos/dos'
CONST ANZ = 1000 -> Anzahl der Feldelemente
RAISE "SCR" IF OpenS()=NIL, -> Auto-Exception für
"WIN" IF OpenW()=NIL -> OpenW/S() global def.
DEF daten[ANZ]:ARRAY OF LONG -> Daten-Array
PROC main() HANDLE
DEF scr=NIL,win=NIL:PTR TO window,q1,q2,b1,b2,maxi
scr,win:=schirmOeffnen()
TextF(20,20,'Sortiert werden jeweils \d Zufalls'+
'zahlen, wobei sie beim ',ANZ)
TextF(20,29,'1. Durchlauf in zufälliger '+
'Reihenfolge gespeichert sind')
TextF(20,38,'und beim 2. in bereits sortierter.')
TextF(20,50,'Alle Zeitangaben in 1/50 Sekunden.')
/* die Prozedur wird als "quoted expression" über-
geben, die beiden Zeiten werden retourniert */
q1,q2:=messen(`quick(daten,0,ANZ-1),
'QuickSort',3,70)
b1,b2:=messen(`bubble(daten,0,ANZ-1),
'BubbleSort',2,160)
/* Im Diagramm ist der längste Balken 500 Pixel
breit, die anderen werden angepaßt */
-> Maximalwert aus allen 4 Messungen finden
maxi:=Max(Max(q1,q2),Max(b1,b2))
Colour(3) -> 2 Balken für QuickSort
RectFill(stdrast,100,72,100+(500*q1/maxi),90)
RectFill(stdrast,100,110,100+(500*q2/maxi),128)
Colour(2) -> 2 Balken für BubbleSort
RectFill(stdrast,100,162,100+(500*b1/maxi),180)
RectFill(stdrast,100,200,100+(500*b2/maxi),218)
-> Warten auf Message (kann nur WindowClose sein)
WaitIMessage(win)
schirmSchliessen(scr,win)
EXCEPT
SELECT exception -> im Fehlerfall Meldung ausgeben
CASE "SCR"
WriteF('Bildschirm ist nicht zu öffnen!\n')
CASE "WIN"
WriteF('Fenster ist nicht zu öffnen!\n')
ENDSELECT
schirmSchliessen(scr,win)
ENDPROC
PROC zeit(prozedur) -> stoppt die benötigte Zeit
DEF d1:datestamp,d2:datestamp,t
-> 1. Zeit nehmen, rechnen, 2. Zeit nehmen
DateStamp(d1); Eval(prozedur); DateStamp(d2)
IF d2.minute>d1.minute -> In 1/50 Sekunden
t:=((d2.minute-d1.minute)*3000)+d2.tick-d1.tick
ELSE
t:=d2.tick-d1.tick
ENDIF
ENDPROC t -> benötigte Zeit zurückgeben
PROC datenAusgeben(titel,y,farbe)
DEF i
Colour(0)
RectFill(stdrast,20,y-7,500,y+1)
Colour(farbe)
TextF(20,y,'\s',titel)
FOR i:=0 TO 9 DO TextF(100+(i*40),y,
'\r\d[5]',daten[i])
ENDPROC
PROC messen(prozedur,titel,farbe,ypos)
-> führt 2 Messungen durch
DEF i,t1,t2
Line(100,ypos,100,ypos+60,farbe)
TextF(10,ypos+33,'\s',titel)
-> vor 1. Durchlauf Array mit Werten füllen
FOR i:=0 TO ANZ-1 DO daten[i]:=Rnd(ANZ)
datenAusgeben('davor:',ypos-2,farbe)
-> Zeit messen und auf Bildschirm ausgeben
t1:=zeit(prozedur); TextF(10,ypos+9,'Zeit: \d',t1)
-> beim zweiten Mal sind die Daten schon sortiert
t2:=zeit(prozedur); TextF(10,ypos+57,'Zeit: \d',t2)
datenAusgeben('danach:',ypos+70,farbe)
ENDPROC t1,t2
PROC schirmOeffnen()
DEF s=NIL:PTR TO screen,w=NIL
s:=OpenS(640,256,2,HIRES_KEY,'Vergleich von '+
'Sortieralgorithmen ©1995 Marcel Bennicke',
[SA_PENS,[-1]:INT,0])
w:=OpenW(0,s.barheight+1,s.width,
s.height-s.barheight-1,IDCMP_CLOSEWINDOW,
WFLG_CLOSEGADGET,'Ausgabefenster',s,15,NIL)
SetTopaz(8); Colour(1)
ENDPROC s,w
PROC schirmSchliessen(s,w)
CloseW(w) -> Null-Argumente sind möglich
CloseS(s) -> klappt auch wenn nichts offen war
ENDPROC